home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 2.toast / pc / sample code / quicktime / quicktime for java / dsapplet.win / src / draggingspritesapplet.java
Encoding:
Java Source  |  2000-09-28  |  8.9 KB  |  265 lines

  1. /*
  2.  * quicktime.app: Sample Code for Initial Seeding
  3.  *
  4.  * © 1997 Copyright, Apple Computer
  5.  * All rights reserved
  6.  */
  7. import java.awt.*;
  8. import java.awt.event.*;
  9. import java.io.IOException;
  10. import java.io.File;
  11. import java.applet.*;
  12.  
  13.  
  14. import quicktime.*;
  15. import quicktime.qd.*;
  16. import quicktime.std.*;
  17. import quicktime.io.*;
  18. import quicktime.std.image.*;
  19. import quicktime.util.*;
  20. import quicktime.std.movies.*;
  21. import quicktime.std.movies.media.*;
  22. import quicktime.app.actions.*;
  23. import quicktime.app.anim.*;
  24. import quicktime.app.audio.*;
  25. import quicktime.app.display.*;
  26. import quicktime.app.image.*;
  27. import quicktime.app.QTFactory;
  28.  
  29.  
  30. import ds.actions.*;
  31.  
  32.  
  33. public class DraggingSpritesApplet extends Applet implements StdQTConstants {
  34.     static final int
  35.         kSnareDrum = 40,
  36.         kClosedHiHat = 44,
  37.         kOpenHiHat = 46,
  38.         kCrashCymbal = 49,
  39.         kRideCymbal = 51;
  40.  
  41.     public void init() {
  42.         DataRef urlMovie = null;
  43.         Movie movie = null;
  44.         try {
  45.             QTSession.open();
  46.             Insets insets = getInsets();
  47.             setBounds (0, 0, (insets.left + insets.right + Integer.parseInt(getParameter("width"))), (insets.top + insets.bottom + Integer.parseInt(getParameter("height"))));
  48.             setLayout (new BorderLayout());
  49.             myQTCanvas = new QTCanvas (QTCanvas.kInitialSize, 0.5F, 0.5F);
  50.             add ("Center", myQTCanvas);
  51.             
  52.             Dimension size = new Dimension(Integer.parseInt(getParameter("width")), Integer.parseInt(getParameter("height")));
  53.             QDGraphics gw = new QDGraphics (new QDRect(size));
  54.             sd = new Compositor (gw, QDColor.red, 20, 1);    
  55.             
  56.             String url = getCodeBase() + getParameter("url");
  57.                 //because we are an applet 
  58.                 // the DataRef version will NOT allow the movie to be opened on win32
  59.                 // if the applet is running locally
  60.                 // so we check to see where the applet is running and act appropriately
  61.             if (getCodeBase().getProtocol().equals("file")) {
  62.                 url = getCodeBase().getFile() + getParameter("url");                
  63.                 OpenMovieFile movieFile = OpenMovieFile.asRead(new QTFile(url));
  64.                 movie = Movie.fromFile (movieFile);
  65.             }else {    
  66.                  urlMovie = new DataRef(url);
  67.                    movie = Movie.fromDataRef (urlMovie, StdQTConstants.newMovieActive);
  68.             }
  69.  
  70.             //create an image sequence from a movies track .
  71.             ImageDataSequence is = ImageUtil.createSequence (movie.getIndTrack(1));
  72.             createSprites (sd, ImageUtil.makeTransparent (is, QDColor.blue), size);
  73.         } catch (Exception e) {
  74.             e.printStackTrace();
  75.             QTSession.close();
  76.         }
  77.     }
  78.     
  79.     public void start () {
  80.         try {
  81.             myQTCanvas.setClient (sd, true);
  82.             sd.getTimer().setRate (2);
  83.         } catch (QTException e) {}
  84.     }
  85.     
  86.     public void stop() {
  87.         myQTCanvas.removeClient();
  88.     }
  89.     
  90.     public void destroy() {
  91.         QTSession.close();
  92.     }
  93.     
  94. //____________________ INSTANCE VARIABLES    
  95.     private Compositor sd;
  96.     private QTCanvas myQTCanvas;
  97.     private ByteEncodedImage beimg;
  98.     private ImageDescription id;
  99.     private boolean performance = true;
  100.                 
  101.     void createSprites (Compositor sd, ImageDataSequence seq, Dimension size) throws Exception {
  102.         // This is the instrument that will be used to play all of the notes
  103.         // of the different actions -> we use a polyphony of 10
  104.         // which is a reasonable estimate of the maximum number of notes
  105.         // that will be sounding at a given time
  106.         final NoteChannelControl nc = new NoteChannelControl (StdQTConstants.kFirstDrumkit, 10);
  107.  
  108.         Matrix matrix = new Matrix();
  109.         matrix.setTx(size.width / 4);
  110.         matrix.setTy(size.height / 2);
  111.         TwoDSprite s1 = new TwoDSprite(seq, matrix, true, 1);
  112.         sd.addMember (s1);
  113.         
  114.         // paint a sprite and set a hot spot region for it
  115.         // the green region is the hot spot
  116.         // we use a 16 bit BigEndian pixel format as we have no blending on this sprite
  117.         matrix = new Matrix();
  118.         matrix.setTx(20);
  119.         matrix.setTy(20);
  120.         QDRect r40 = new QDRect (40, 40);
  121.         QDRect r8 = new QDRect (1, 1, 8, 8);
  122.         QDGraphics y = new QDGraphics (QDConstants.k16BE555PixelFormat, r40);
  123.         y.setBackColor (QDColor.yellow);
  124.         y.eraseRect (null);
  125.         y.setForeColor (QDColor.green);
  126.         y.paintRect (r8);
  127.         EncodedImage ei = RawEncodedImage.fromPixMap (y.getPixMap());
  128.         ImageDescription id = new ImageDescription (y.getPixMap());
  129.         ImageDataSequence idsy = new ImageDataSequence (id);
  130.         idsy.addMember (ei);
  131.         if ((QTSession.isCurrentOS(QTSession.kWin32) && QTSession.getQTMajorVersion() == 3) == false)    //doesn't work on QT3.0.2 on Win
  132.             idsy = ImageUtil.makeTransparent (idsy, QDColor.black, new QDGraphics (QDConstants.k16BE555PixelFormat, r40), new Region (r8));
  133.         TwoDSprite s2 = new TwoDSprite(idsy, matrix, true, 10);
  134.         sd.addMember (s2);
  135.  
  136.         matrix = new Matrix();
  137.         matrix.setTx(size.width / 2);
  138.         matrix.setTy(size.height / 2);
  139.         TwoDSprite s3 = new TwoDSprite(seq, 15, matrix, true, 10);
  140.         sd.addMember (s3);
  141.         ImageSequencer is3 = new ImageSequencer (seq);
  142.         is3.setCurrentFrame (15);    //keep in sync with sprite's current image
  143.         is3.setLooping (ImageSequencer.kLoopForwards);
  144.  
  145.         SimpleActionList al = new SimpleActionList();
  146.         ImageSequencer is = new ImageSequencer (seq);
  147.         is.setLooping (ImageSequencer.kLoopForwards);
  148.         al.addMember (new NextImageAction (15, 1, is, s1));
  149.         BounceAction b1 = new BounceAction (20, 1, sd, s1, 1, 2);
  150.         b1.setActionable (new Actionable () {
  151.             public void trigger () {
  152.                 try {
  153.                     nc.playNoteFor (kCrashCymbal, 127, 20);
  154.                 } catch (QTException e) {
  155.                     e.printStackTrace();
  156.                 }
  157.             }
  158.         });
  159.         al.addMember (b1);
  160.                     // 360 degrees at a scale of 20
  161.         al.addMember (new RotateAction (360, 20, sd, s3));
  162.                     // 360/ (1/2)number of images changes at a scale of 20
  163.         al.addMember (new NextImageAction ((360 / seq.size() / 2), 20, is3, s3));
  164.         al.addMember (new BounceAction (1, 10, sd, s3, 1, 1)); // a slow drift
  165.         sd.addController(al);
  166.  
  167.     //all mouse downs with NO modifiers pressed will drag all sprites
  168.         Dragger dragger = new Dragger (MouseResponder.kNoModifiersMask);
  169.         dragger.setActionable (new Actionable () {
  170.             public void trigger () {
  171.                 try {
  172.                     nc.playNoteFor (kRideCymbal, 127, 80);
  173.                 } catch (QTException e) {
  174.                     e.printStackTrace();
  175.                 }
  176.             }
  177.         });
  178.         SWController ct = new SWController (dragger, true);
  179.         sd.addController (ct);
  180.         
  181.     //only shift key down when mouse pressed will allow sprite number 2 & 3 to be scaled when dragged
  182.         MouseController controller = new SWController (new Scaler (400, InputEvent.SHIFT_MASK), false);
  183.         controller.addMember (s3);
  184.         controller.addMember (s2);
  185.         sd.addController (controller);
  186.  
  187.     //only option/alt key will allow sprite number 3 to be skewed when dragged
  188.         controller = new SWController (new Skewer (200, 200, InputEvent.ALT_MASK), false);
  189.         controller.addMember (s2);
  190.         sd.addController (controller);
  191.         
  192.         // this responder responds to rollover type events on sprites when NO modifiers are pressed
  193.         final GenericResponder gr = GenericResponder.asRolloverListener (MouseResponder.kNoModifiersMask, MouseResponder.kModifiersExactMatch);
  194.         // add a listener to play notes when rolled over 
  195.         // 
  196.         gr.addQTMouseMotionListener (new QTMouseMotionAdapter () {            
  197.             // keep the notes playing even when we are being dragged
  198.             // however this is NOT enough to properly handle drag events
  199.             // - this is done be the Dragger-Controller pairing
  200.             public void mouseDragged (MouseEvent event) {
  201.                 try {
  202.                     nc.playNoteFor (kClosedHiHat, 127, 80);
  203.                 } catch (QTException e) {
  204.                     e.printStackTrace();
  205.                 }
  206.             }
  207.  
  208.             public void mouseMoved (MouseEvent event) {
  209.                 try {
  210.                     nc.playNoteFor (kClosedHiHat, 127, 80);
  211.                 } catch (QTException e) {
  212.                     e.printStackTrace();
  213.                 }
  214.             }
  215.             
  216.             public void mouseExitedTarget (MouseEvent event) {
  217.                 try {
  218.                     nc.playNoteFor (kOpenHiHat, 127, 80);
  219.                 } catch (QTException e) {
  220.                     e.printStackTrace();
  221.                 }
  222.             }
  223.  
  224.             public void mouseEnteredTarget (MouseEvent event) {
  225.                 try {
  226.                     nc.playNoteFor (kSnareDrum, 127, 80);
  227.                 } catch (QTException e) {
  228.                     e.printStackTrace();
  229.                 }
  230.             }
  231.         });
  232.         // another listener that prints out the target on entry and the space on exit of a rollover occurance
  233.         gr.addQTMouseMotionListener (new QTMouseMotionAdapter () {
  234.             GenericResponder g = gr;
  235.             GraphicsMode savedGM;
  236.             GraphicsMode setGM = new GraphicsMode (QDConstants.blend, QDColor.lightGray);
  237.             
  238.             public void mouseEnteredTarget (MouseEvent event) {
  239.                 try {
  240.                     if (g.getTarget() instanceof TwoDSprite) {    // just for sanity
  241.                         TwoDSprite sprite = (TwoDSprite)g.getTarget();
  242.                         savedGM = sprite.getGraphicsMode();
  243.                         sprite.setGraphicsMode (setGM);
  244.                     }
  245.                 } catch (QTException e) {
  246.                     throw new QTRuntimeException (e);
  247.                 }
  248.             }
  249.  
  250.             public void mouseExitedTarget (MouseEvent event) {
  251.                 try {
  252.                     if (g.getTarget() instanceof TwoDSprite) {    // just for sanity
  253.                         TwoDSprite sprite = (TwoDSprite)g.getTarget();
  254.                         sprite.setGraphicsMode (savedGM);
  255.                     }
  256.                 } catch (QTException e) {
  257.                     throw new QTRuntimeException (e);
  258.                 }
  259.             }
  260.         });
  261.         SWController ctr = new SWController (gr, true);
  262.         sd.addController (ctr);
  263.     }
  264. }
  265.